home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Interactive Reference Guide / C-C++ Interactive Reference Guide.iso / c_ref / csource5 / 349_01 / sss.arc / EX_0701.C < prev    next >
Encoding:
C/C++ Source or Header  |  1991-04-10  |  2.5 KB  |  127 lines

  1. /* Program EX_0701.C
  2.    Listing 14C - see documentation in TUTOR.SSS
  3. */
  4.  
  5. #include "SSSC.H"
  6.  
  7. #define ARRIVL  1
  8. #define STARTA  2
  9. #define ENDACT  3
  10. #define NEXTAC  4
  11.  
  12. #define ORD1    1
  13. #define ORD2    2
  14. #define DELUX1  3
  15. #define DELUX2  4
  16.  
  17. int  s, ecode, server[2];
  18.  
  19. void prime()
  20. {
  21.   server[0] = 1;
  22.   server[1] = 1;
  23.   INIQUE(5, 3, 1);
  24.   INISTA(1, "Interrupts", 0, 0, 0.0, 0.0);
  25.   SIMEND(60.0);
  26.   CREATE(0.0, 0);
  27. }
  28.  
  29. int sindex()
  30. {
  31.   if (IDE() < DELUX1) return(IDE() - 1);
  32.   else     return((IDE() - ORD2) - 1);
  33. }
  34.  
  35. int shortr()
  36. {
  37.   if (NQ(4) + NQ(2) < NQ(3) + NQ(1)) SETIDE(IDE() + 1);
  38.   return(IDE());
  39. }
  40.  
  41. void preemp()
  42. {
  43.   int i, preide; double remt;
  44.   QUEUE(5, 0.0);
  45.   i = 1;
  46.   while ((i <= NC()) &&
  47.    ((IDIC(i) > ORD2) || (NEIC(i) != ENDACT)))
  48.      i++;
  49.  
  50.   if (i <= NC())
  51.   {
  52.     remt = TIC(i) - T();
  53.     REMVFC(i);
  54.     preide = IDE();
  55.     SETA(1, A(1) + 1);
  56.     SETA(2, remt);
  57.     SETQDC(1, "LIFO");
  58.     QUEUE(IDE(), 0.0);
  59.     SETQDC(1, "FIFO");
  60.     REMVFQ(5, 1);
  61.     SCHED(0.0, STARTA, preide + 2);
  62.   } else
  63.  
  64.   {
  65.     REMVFQ(5, 1);
  66.     QUEUE(shortr(), 0);
  67.   }
  68. }
  69.  
  70. main()
  71. {
  72.   prime();
  73.  
  74.   do
  75.   {
  76.     if ((ecode = NEXTEV()) > 0)
  77.     switch(ecode)
  78.     {
  79.  
  80.       case ARRIVL:
  81.                 CREATE(EX(2), 0);
  82.                 SETA(1, 0.0);
  83.                 SETA(2, TR(1, 2, 3));
  84.                 if (RA() < 0.25) SETIDE(DELUX1);
  85.                 else             SETIDE(ORD1  );
  86.                 SCHED(0.0, NEXTAC, IDE());
  87.                 break;
  88.  
  89.       case NEXTAC:
  90.                 if (server[0] > 0)
  91.                   SCHED(0.0, STARTA, IDE());
  92.                 else if (server[1])
  93.                   SCHED(0.0, STARTA, IDE()+1);
  94.                 else if (IDE() == DELUX1)
  95.                   preemp();
  96.                 else
  97.                   QUEUE(shortr(), 0.0);
  98.                 break;
  99.  
  100.       case STARTA:
  101.                 (server[sindex()])--;
  102.                 SCHED(A(2), ENDACT, IDE());
  103.                 break;
  104.  
  105.       case ENDACT:
  106.                 s = sindex();
  107.                 (server[s])++;
  108.                 if (IDE() < DELUX1) TALLY(1, A(1));
  109.                 DISPOS();
  110.                 if (NQ(s + 3))
  111.                 {
  112.                   REMVFQ(s + 3, 1);
  113.                   SCHED(0, STARTA, IDE());
  114.                 }
  115.  
  116.                 else if (NQ(s + 1))
  117.                 {
  118.                   REMVFQ(s + 1, 1);
  119.                   SCHED(0, STARTA, IDE());
  120.                 }
  121.                 break;
  122.     }
  123.   } while (ecode);
  124.  
  125.   SUMRY("");
  126. }
  127.